#include "tcp/tcp.h"
#include "log.h"
#include "ipc/Ftok.h"
#include "unistd.h"
#include "MensajesIRC.h"
#include "tcp/MensajeroTCP.h"
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>

void registrar_nombre_usuario(int socket, const char* nombre){

    MensajeIRC_USER user(nombre);
    if(!MensajeroTCP::enviarMensajeA(socket, (char*) &user, sizeof(user))){
	perror("No se pudo enviar el mensaje USR al servidor");
	exit(-1);
    }
}

int lanzar_emisor(int sockfd, const char* nombre_usuario){
    int pid = fork();
    if(pid==0){
	char socket[20];
	sprintf(socket, "%d", sockfd);
	execlp("./emisor", "./emisor", socket, nombre_usuario, NULL);
	perror("Error en el execlp del emisor");
	exit(-1);
    }
    if(pid == -1){
	perror("Error en el fork del emisor");
	exit(-1);
    }
    return pid;
}


int lanzar_receptor(int sockfd, const char* nombre_usuario){
    int pid = fork();
    if(pid==0){
	char socket[20];
	sprintf(socket, "%d", sockfd);
	execlp("./receptor", "./receptor", socket, nombre_usuario, NULL);
	perror("Error en el execlp del receptor");
	exit(-1);
    }
    if(pid == -1){
	perror("Error en el fork del receptor");
	exit(-1);
    }
    return pid;
}


int main(int argc, char* argv[]){

    if(argc < 4){
	log("%s <nombre_usuario> <servidor> <puerto>\n", argv[0]);
	exit(-1);
    }
    
    char* nombre = argv[1];
    char* server = argv[2];
    int puerto = atoi(argv[3]);

    //Creo el path para ftok
    char path_buffer[1024];
    char *path;
    path = ftok_crear_archivo(nombre, path_buffer, 1024);
    if(!path){
	log("No se pudo crear el path para FTOK.");
	exit(-2);
    }
    else{
	log("Creado exitosamente el archivo %s para FTOK.\n", path);
    }
    
    //Conectar al servidor con el nick
    int sockfd = tcpopact(server, puerto);
    if(sockfd < 1){
	perror("Error al conectar con el servidor");
	exit(-2);
    }
    log("Cliente conectado con el servidor. Envio nombre de usuario.\n");
    registrar_nombre_usuario(sockfd, nombre);
    
    //lanzo emisor y receptor
    int pid_receptor = lanzar_receptor(sockfd, nombre);
    int pid_emisor = lanzar_emisor(sockfd, nombre);
    
    int status;
    waitpid(pid_receptor, &status, 0);
    kill(pid_emisor, SIGKILL);
    waitpid(pid_emisor, &status, 0);

    return 0;
}

